package island.gotenyama.wand.web;

import island.gotenyama.wand.bean.Constants;
import island.gotenyama.wand.bean.MessageKey;

import java.io.Serializable;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.Collections;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.Map.Entry;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.MessageSource;

/**
 * ビュー用のサービス委譲クラス
 * 
 * @author tk
 */
public class ViewDelegate implements Serializable {

	/**
	 * serialVersionUID
	 */
	private static final long serialVersionUID = 1L;

	/**
	 * LOGGER
	 */
	protected static final Log LOG = LogFactory.getLog(ViewDelegate.class);

	@Autowired(required = true)
	@Qualifier("messageSource")
	protected MessageSource messageSource;

	/**
	 * 対象文字列をエンコードする。
	 * 
	 * @param entry エンコード対象
	 * @return エンコードされた文字列
	 */
	public String encode(String entry) {
		if (entry == null) {
			return entry;
		}
		final String enc = Constants.DEFAULT_ENCODING;
		String result = null;
		try {
			result = URLEncoder.encode(entry, enc);
		} catch (UnsupportedEncodingException e) {
			if (LOG.isErrorEnabled()) {
				final String errMsg = "サポートされていないエンコーディング方式のため、エラー。enc=" + enc;
				LOG.error(errMsg, e);
			}
		}
		return result;
	}

	/**
	 * エラーメッセージリストのキーを取得する。
	 * 
	 * @return エラーメッセージリストのキー
	 */
	public String getErrorMessage(MessageKey messageKey) {
		if (messageKey == null) {
			return null;
		}
		Object[] params = null;
		if (messageKey.getPlaceFolderList() != null) {
			params = new Object[messageKey.getPlaceFolderList().size()];
			for (int i = 0; i < messageKey.getPlaceFolderList().size(); i++) {
				params[i] = messageKey.getPlaceFolderList().get(i);
			}
		}
		return messageSource.getMessage(messageKey.getKey(), params, Locale.JAPAN);
	}

	/**
	 * コンバート対象のマップ
	 */
	public static final Map<String, String> escapeStringMap;
	static {
		Map<String, String> tmpMap = new HashMap<String, String>();
		tmpMap.put("<", "&lt;");
		tmpMap.put(">", "&gt;");
		escapeStringMap = Collections.synchronizedMap(tmpMap);
	}

	/**
	 * htmlをコンバートする。
	 * 
	 * @param entry コンバート対象
	 * @return 文字列
	 */
	public String out(String entry) {
		if (StringUtils.isBlank(entry)) {
			return entry;
		}
		for (Entry<String, String> entrySet : escapeStringMap.entrySet()) {
			String key = escapeStringMap.get(entrySet.getKey());
			entry = entry.replace(key, entrySet.getValue());
		}
		return entry;
	}

	/**
	 * 指定文字数でトリミングする。
	 * 
	 * @param entry トリミング対象
	 * @param length 残す文字列数
	 * @return トリミングした結果
	 */
	public String trim(String entry, int length) {
		if (StringUtils.isBlank(entry)) {
			return entry;
		}
		if (entry.length() < length) {
			return entry;
		}
		return entry.substring(0, length);
	}
}
